﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using SUCE.SERVICE.Properties;
using System.Data.Common;
using com.byt.webcore;
using System.Windows.Forms;
using System.Threading;
using SUCE.SERVICE;
using suce.upload;

namespace com.byt.gestor.service
{
    static class Helper
    {
        private static Dictionary<string, string> config;

        private static int DownloadFile(String remoteFilename, String localFilename)
        {
            // Function will return the number of bytes processed
            // to the caller. Initialize to 0 here.
            int bytesProcessed = 0;

            // Assign values to these objects here so that they can
            // be referenced in the finally block
            Stream remoteStream = null;
            Stream localStream = null;
            WebResponse response = null;

            // Use a try/catch/finally block as both the WebRequest and Stream
            // classes throw exceptions upon error
            try
            {
                // Create a request for the specified remote file name
                WebRequest request = WebRequest.Create(remoteFilename);
                if (request != null)
                {
                    // Send the request to the server and retrieve the
                    // WebResponse object 
                    response = request.GetResponse();
                    if (response != null)
                    {
                        // Once the WebResponse object has been retrieved,
                        // get the stream object associated with the response's data
                        remoteStream = response.GetResponseStream();

                        // Create the local file
                        localStream = File.Create(localFilename);

                        // Allocate a 1k buffer
                        byte[] buffer = new byte[1024];
                        int bytesRead;

                        // Simple do/while loop to read from stream until
                        // no bytes are returned
                        do
                        {
                            // Read data (up to 1k) from the stream
                            bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                            // Write the data to the local file
                            localStream.Write(buffer, 0, bytesRead);

                            // Increment total bytes processed
                            bytesProcessed += bytesRead;
                        } while (bytesRead > 0);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                File.Copy(@"D:\AppVUCE\SUCE\SUCE\app.txt", localFilename, true);
            }
            finally
            {
                // Close the response and streams objects here 
                // to make sure they're closed even if an exception
                // is thrown at some point
                if (response != null) response.Close();
                if (remoteStream != null) remoteStream.Close();
                if (localStream != null) localStream.Close();
            }

            // Return total bytes processed to caller.
            return bytesProcessed;
        }

        private static Dictionary<string, string> LoadConfig()
        {
            if (config == null)
            {


                config = new Dictionary<string, string>();
                string line, key, value;
                int pos;

                string pathAppConfig = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "app.txt");
                //DownloadFile(Settings.Default.URLGestorSuce + "app.txt", pathAppConfig);
                int step = 10;
                while (!File.Exists(pathAppConfig))
                {
                    Thread.Sleep(200);
                    step--;
                    if (step == 0)
                        break;
                }


                StreamReader reader = new StreamReader(pathAppConfig);

                try
                {
                    do
                    {
                        line = reader.ReadLine().Trim();
                        pos = line.IndexOf("=");
                        if (!string.IsNullOrEmpty(line) && line[0] != '#' && pos > -1)
                        {
                            key = line.Substring(0, pos).Trim();
                            value = line.Substring(pos + 1).Trim();
                            config.Add(key, value);
                        }
                    } while (reader.Peek() != -1);
                }
                catch { }
                finally { reader.Close(); }


            }

            return config;
        }

        private static string getProperty(string key, string keyDefault)
        {
            string value;
            Dictionary<string, string> prop = LoadConfig();
            key = key.ToLower();
            try
            {
                value = prop[key];
                if (string.IsNullOrEmpty(value))
                    value = prop[keyDefault];
            }
            catch
            {
                value = prop[keyDefault];
            }
            return value;
        }

        public static Connection getConnection(string nombre)
        {
            string driver = getProperty("connection." + nombre + ".driver", "connection.default.driver");
            string url = getProperty("connection." + nombre + ".url", "connection.default.url");

            Type typeConn = Type.GetType(driver);

            DbConnection conn = (DbConnection)Activator.CreateInstance(typeConn, new object[] { url });
            conn.Open();

            return new Connection(conn);

        }

        public static void setPathUpload()
        {
            UploadHelper.pathFiles = getProperty("path.upload", "");
        }


    }
}
